package com.example.common.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class DateTimeUtil {
    // 默认格式
    private static final String DEFAULT_PATTERN = "yyyy-MM-dd HH:mm:ss";
    
    /**
     * 获取当前时间（LocalDateTime）
     */
    public static LocalDateTime now() {
        return LocalDateTime.now();
    }
    
    /**
     * 获取当前日期（LocalDate）
     */
    public static LocalDate today() {
        return LocalDate.now();
    }
    
    /**
     * 将LocalDateTime格式化为字符串
     */
    public static String format(LocalDateTime dateTime, String pattern) {
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }
    
    /**
     * 使用默认格式格式化
     */
    public static String format(LocalDateTime dateTime) {
        return format(dateTime, DEFAULT_PATTERN);
    }
    
    /**
     * 解析字符串为LocalDateTime
     */
    public static LocalDateTime parse(String dateStr, String pattern) {
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(pattern));
    }
    
    /**
     * 获取某天的开始时间（00:00:00）
     */
    public static LocalDateTime startOfDay(LocalDate date) {
        return date.atStartOfDay();
    }
    
    /**
     * 获取某天的结束时间（23:59:59）
     */
    public static LocalDateTime endOfDay(LocalDate date) {
        return date.atTime(LocalTime.MAX);
    }
    
    /**
     * LocalDateTime 转 Date
     */
    public static Date toDate(LocalDateTime dateTime) {
        return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
    }
    
    /**
     * Date 转 LocalDateTime
     */
    public static LocalDateTime toLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }
    
    /**
     * 当前时间加上秒数
     */
    public static LocalDateTime plusSeconds(long seconds) {
        return LocalDateTime.now().plusSeconds(seconds);
    }
    
    /**
     * 当前时间加上分钟
     */
    public static LocalDateTime plusMinutes(long minutes) {
        return LocalDateTime.now().plusMinutes(minutes);
    }
    
    /**
     * 当前时间加上小时
     */
    public static LocalDateTime plusHours(long hours) {
        return LocalDateTime.now().plusHours(hours);
    }
    
    /**
     * 当前时间加上天数
     */
    public static LocalDateTime plusDays(long days) {
        return LocalDateTime.now().plusDays(days);
    }
    
    /**
     * 获取两个时间之间的秒数差
     */
    public static long secondsBetween(LocalDateTime start, LocalDateTime end) {
        return Duration.between(start, end).getSeconds();
    }
    
    /**
     * 判断一个时间是否在另一个时间区间内
     */
    public static boolean isBetween(LocalDateTime target, LocalDateTime start, LocalDateTime end) {
        return !target.isBefore(start) && !target.isAfter(end);
    }
    
    /**
     * 将LocalDateTime从一个时区转换到另一个时区
     */
    public static LocalDateTime convertZone(LocalDateTime dateTime, String fromZone, String toZone) {
        ZonedDateTime fromZoned = dateTime.atZone(ZoneId.of(fromZone));
        ZonedDateTime toZoned = fromZoned.withZoneSameInstant(ZoneId.of(toZone));
        return toZoned.toLocalDateTime();
    }
}
